package com.test.practice.reflact;

import javax.swing.*;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * 通过用户输入类的全路径，来获取该类的成员方法和成员属性
 */
public class ReflectTionDemo {

    public ReflectTionDemo() {
        // 用户输入类的全路径
        String classPath = JOptionPane.showInputDialog(null, "输入类全路径");
        try {
            // 根据类的全路径，进行类加载，返回类的class对象
            Class cla = Class.forName(classPath);
            // 利用class对象cla的自身，返回方法对象集合
            Method[] methods = cla.getDeclaredMethods();
            // 遍历Method数组，并输出方法信息
            for (Method method : methods) {
                System.out.println("=========获取方法信息");
                System.out.println(method);
            }
            // 利用class对象cla的自身，返回属性对象集合
            Field[] fileds = cla.getDeclaredFields();
            for (Field field : fileds) {
                System.out.println("=========获取属性信息");
                System.out.println(field);
            }
            Constructor[] c = cla.getDeclaredConstructors();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public ReflectTionDemo(Person p) throws NoSuchMethodException, SecurityException {
        // 根据类的全路径，进行类加载，返回类的class对象
        Class cla = p.getClass();
        // 利用class对象cla的自身，返回方法对象集合
        Method[] methods = cla.getDeclaredMethods();
        // 遍历Method数组，并输出方法信息
        for (Method method : methods) {
            System.out.println("=========获取方法信息");
            System.out.println(method);
        }
        cla.getDeclaredClasses();
        cla.getDeclaringClass();

        Method me = cla.getMethod("getGender");
        System.out.println(me.getName());
        // 利用class对象cla的自身，返回属性对象集合
        Field[] fileds = cla.getDeclaredFields();
        for (Field field : fileds) {
            System.out.println("=========获取属性信息");
            System.out.println(field);
        }
        Constructor[] c = cla.getDeclaredConstructors();

    }

    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException {
        Person p = new Person();
        ReflectTionDemo rtd = new ReflectTionDemo(p);
        // 三种取得class类的方法
        Class c1 = p.getClass();
        Class c2 = Person.class;// 因为编译时就能确定该类是否存在代码更安全，不需要调用方法程序性能更高
        Class c3 = Class.forName("com.test.practice.reflact.Person");



        ReflectTionDemo rtd2 = new ReflectTionDemo();

    }
}
